/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package IA;

import Grafico.Ventana_principal;
import Interfaz.Dibujador;
import Mundo.Mapa;
import Personajes.Batallon;
import Personajes.Ejercito;
import java.io.Serializable;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author ADRIAN VARGAS
 */
public class QuickIA extends Thread implements IA, Serializable{

    Mapa map;   
    Ejercito ej_enem;
    Ejercito ej_amigo;
    int num_cel;//celda en las cuales podra "ver" al enemigo
    transient Dibujador dibuja;
    Batallon[] batobj;
    int [] patrulla = new int[15];
    public Ventana_principal v;
     boolean detener=false;

    @Override
    public void run(){
        while(true){
        decide_IA(v);
        v.dibuja();
        //v.dibujaMapa(v.getCanvasStrategy().getDrawGraphics());
        //v.getCanvasStrategy().show();
        try {
            sleep(500);
        } catch (InterruptedException ex) {
            Logger.getLogger(QuickIA.class.getName()).log(Level.SEVERE, null, ex);
        }
        }
    }
    

    public QuickIA(Mapa map, Ejercito ej_amigo, Ejercito ej_enem) {
        super("HiloIA");
        this.map = map;        
        this.ej_enem = ej_enem;
        this.num_cel=5;
        this.ej_amigo=ej_amigo;
        for(int i=0; i<15;i++)patrulla[i]=0;
    }

    @Override
    public void decide_IA(Ventana_principal v) {

        int numAmig;
        int numEnem=ej_enem.getBatallones().size();
        Batallon elegido;
        int ielegido=0;
        int jelegido=0;
        int dist=0;//en realidad seria distancia al cuadrado
        boolean se_ataco=false;

        if (!detener){
            if (batobj!=null){
                numAmig=batobj.length;
                if(batobj.length>0) elegido=batobj[0];

                else elegido=null;


                 for(int i=0; i< numAmig; i++){
                    for (int j=0; j< numEnem; j++){
                        dist=distancia(elegido,ej_enem.getBatallones().get(jelegido));
                            if (dist==1 && !elegido.isMuerto() && !se_ataco){

                                this.ej_amigo.ataca(elegido, ej_enem.getBatallones().get(jelegido));
                                se_ataco=true;
                                break;
                            }
                            if (!batobj[i].isMuerto() &&  !ej_enem.getBatallones().get(j).isMuerto() &&((distancia(batobj[i],ej_enem.getBatallones().get(j))<dist) || elegido.isMuerto())){

                             elegido= batobj[i];
                             ielegido=i;
                             jelegido=j;
                             dist=distancia(elegido,ej_enem.getBatallones().get(jelegido));

                            }

                        }
                    }
                       if (dist==1 && !elegido.isMuerto() && !se_ataco){

                                this.ej_amigo.ataca(elegido, ej_enem.getBatallones().get(jelegido));
                                se_ataco=true;
                }

                    for(int i=0; i< numAmig; i++){
                        if (i!=ielegido && !batobj[i].isMuerto()) patrulla(batobj[i],i);
                    }

                    if(!se_ataco){
                        if (dist<=num_cel*num_cel){
                            //patrulla(elegido,ielegido);
                            String lugar;
                            lugar=elige_movimiento(elegido,ej_enem.getBatallones().get(jelegido));
                            if (prueba_mover(lugar,elegido)){

                                if (lugar.equals("ARRIBA")){elegido.mover(map, 0, -1);}
                                if (lugar.equals("ABAJO")){elegido.mover(map, 0, 1);}
                                if (lugar.equals("IZQUIERDA")){elegido.mover(map, -1, 0);}
                                if (lugar.equals("DERECHA")){elegido.mover(map, 1, 0);}

                            }


                            //aca va lo complicado, en caso no se pueda

                        }
                        else{
                            if (!elegido.isMuerto())patrulla(elegido,ielegido);

                        }
                    }
            }
        }
    }

    private String elige_movimiento(Batallon batprop,Batallon batenem ){
        String movimiento=null;

        if (absoluto(batprop.getX()-batenem.getX())<absoluto(batprop.getY()-batenem.getY())){

            if (batprop.getY()>batenem.getY()) movimiento="ARRIBA";
            else movimiento="ABAJO";
        }
        else{
            if (batprop.getX()>batenem.getX()) movimiento="IZQUIERDA";
            else movimiento="DERECHA";

        }


        return movimiento;
    }

    public void detente(){

        this.detener=true;
                           
    }

    public void sigue(){
        this.detener=false;

    }

    private int absoluto(int i){
        if (i>=0) return i;
        return -i;

    }


    @Override
    public void set_batobj(Batallon[] bat) {
        batobj=bat;
    }

    public int distancia(Batallon bat1, Batallon bat2){

        return ((bat1.getX()-bat2.getX()) * (bat1.getX()-bat2.getX()) +(bat1.getY()-bat2.getY()) * (bat1.getY()-bat2.getY()));
    }

    public void patrulla(Batallon bat, int i){

        boolean mueve;

        if (patrulla[i]==0){

            mueve=prueba_mover("IZQUIERDA",bat);
            if (mueve) bat.mover(map, -1, 0);
            else{
                patrulla[i]=1;
                bat.mover(map, 1, 0);
            }
        }
        else{

            mueve=prueba_mover("DERECHA", bat);
            if (mueve) bat.mover(map, 1, 0);
            else{
                patrulla[i]=0;
                bat.mover(map, -1, 0);
            }
        }
    }

    private boolean prueba_mover(String direccion, Batallon bat ){
        
        int x=0,y=0;
        int xbat=bat.getX(), ybat=bat.getY();
        
        if (direccion.equals("DERECHA")){x=1;y=0;}
        if (direccion.equals("IZQUIERDA")){x=-1;y=0;}
        if (direccion.equals("ARRIBA")){x=0;y=-1;}
        if (direccion.equals("ABAJO")){x=0;y=1;}

        try{if (map.celdas[y+ybat][x+xbat].getTipoTerreno()=='E' ||map.celdas[y+ybat][x+xbat].getElementoEnCelda()=='a'|| map.celdas[y+ybat][x+xbat].getTipoTerreno()=='M' ||map.celdas[y+ybat][x+xbat].getTipoTerreno()=='a' ||map.celdas[y+ybat][x+xbat].getTipoTerreno()=='.' ||map.celdas[y+ybat][x+xbat].getTipoTerreno()=='R') return false;}
        catch(Exception exception){return false;}

        return true;
    }

}
